"""
______________________________
time：2021/7/2
______________________________
测试是否可以正常使用appium进行测试；
"""
"""
底层也是通过http通信；
客户端(代码)(Windows)——appium server(服务)(windows)——真机/模拟器(android/ios)； 
                            发送请求(客户端)          接受请求(服务端)
                                                appium在设备上安装软件，用来接收请求(有ip+端口号)
                                            android/ios每个系统都有自带的自动化框架

客户端(代码)与appium server进行通信
各种语言的appium
底层也是各种指令(command)——实质是接口，每个http请求包含：请求类型、请求url、请求数据；
tcp


————————————————————————————————————————————————————————————
#adb devices 获取已链接的设备 夜神模拟器需连接，雷电不需要;真机需要开启USB调试模式；

启动参数：http://appium.io/docs/en/about-appium/getting-started/
General Capabilities：必写的启动参数，安卓、ios通用；
automationName：自动化框架名称，实质都是调用移动端自带的自动化测试框架；
移动端自带的自动化测试框架：
    ios9.3及以上： 苹果的 XCUITest
    ios9.3及以下： 苹果的UIAutomation
    Android4.2+： 谷歌的UiAutomator UiAutomator2(appiumv1.15开始都用的是2)
    Android2.3+： 谷歌的Instrumentation(通过绑定另外的项目——Selendroid提供Instrumentation的支持)
platformName：平台名称
platformVersion：平台版本，不同的版本会用到不同的测试框架引擎，不同版本有不同的测试框架；
deviceName：
app：apk的路径，填了就会去安装，一般不写这个；
noReset:默认重置；
"""

from appium import webdriver

"""
命令行执行
# 入口activity:
命令语法：
aapt dump badging D:\apk应用名(路径不能有中文) 找到包名和launchable-activity
"""
# 在安卓7.1.2上面打开销帮帮CRM应用
desired_caps = {
    "automationName": "UiAutomator2",
    "platformName": "Android",
    "platformVersion": "7.1.2",
    "deviceName": "Oppo_phone",
    "appPackage": "io.dcloud.xbb.ent",  # 通过包名绑定对应app
    "appActivity": "io.dcloud.PandoraEntry",
    "noReset": True
}
# 跟appium建立连接然后把启动参数发给它
driver = webdriver.Remote(
    command_executor="http://127.0.0.1:4723/wd/hub", desired_capabilities=desired_caps)

driver.find_element_by_accessibility_id()

"""
执行时确保：
1.设备在线；#adb devices  
2.appium server已启动；

通信过程：(appium中日志信息的大概理解)
1.pycharm中发送http请求到appium server
2.appium server收到之后，创建session
3.获取已连接的设备，并找到对应的安卓版本号
4.给这个设备上安装3个apk：
        settings_apk-debug.apk
        appium-uiautomator2-server-v4.3.0.apk
        appium-uiautomator2-server-debug-androidTest.apk
  a.获取io.appium.settings的状态及它的版本，以确保是当前匹配的最新的版本；
  (如果没有则安装，一般只有首次会安装，安装后不用再删了，不然下次还会自动安装)；安装的是这个：  settings_apk-debug.apk
  b.获取io.appium.uiautomator2.server的状态及其版本，以确保是当前匹配最新的版本。
    io.appium.uiautomator2.server.test类似；
  
5.启动手机上的uiautomator2.server的服务，然后设置将本地appium server收到的指令都从本地8200端口转发到设备(手机、模拟器)6790端口;
6.跟手机创建会话，
7.打开app;
8.如果60s内，appium server没有收到客户端的http请求，主动关闭与客户端的会话，主动关闭与手机端的会话，然后关闭app.

  端口号： 之后多设备转发会遇到这块内容
  pycharm——》appium[4723]——》8200[appium的代理端口]——》6790[手机上的端口]
                appium统一把请求转到这个代理端口上，然后代理端口再转到手机上的端口；
                
————————————————————————————————————————————————
adb启停，默认端口5037
adb kill-server
adb start-server

获取当前活跃的页面
adb shell dumpsys activity activities|findstr mResumedfActivity


android系统：原生控件 html 混合
android系统的原生控件如何定位：借助第三方工具
定位思路：根据元素本身的特征，遍历查找元素；实在找不到了，可以根据坐标；appium新增的一种定位方式：图形定位，图片比对

app元素定位查找工具：
方式一：android系统自带的测试框架：uiautomatorviewer.bat
使用时要求：
1.设备不能被占用；2.adb devices 要识别到设备；3.安卓8以上目前貌似不支持；
在app定位中，如果样式、格式类似只是内容不同，基本上id是一样的；


手机端注重交互(触屏灵敏度等)，web端主要是承载内容

__________________________________________
元素定位的三个工具

单一定位有：id、 class_name、 accessibility_id：(description)   
支持组合定位有：xpath、android_uiautomator

app元素定位的5种方式：
id：用的最多，让开发加上id或者少变动id，不然做app自动化的意义不大，一变动改动量太大了；
xpath：安卓app自动化不推崇xpath
class_name

通过安卓自己本身自带的:
android_uiautomator：(uiautomator2)
accessibility_id：(description)   

坐标能不用就不用，因为坐标换个手机就不能用了；

UiAutomator——UiSelector类完成的，java语言的
resourceId("") appium1.15版本之后的写法；

支持多属性组合定位：


_______________________________________
视频里讲的一些app特有操作：
1.列表滑动流程
2.swipe实现触屏操作
3.MultiAction类实现多点触控
4.driver.tap(列表(坐标点),长按时长):可以实现多个手指对屏幕进行点击操作，最多5个手指；

"""
